/**
 * 01背包，但是代价是位或，而不是加
 * 求总代价不超过M的情况下的最大收益
 * 因此这不是背包，其实就是枚举
 * 考虑不超过M的所有可能的代价，假设M的二进制形式是：xxxx1.....
 * 则合法的代价必然形如：
 * xxxx1.....
 * xxxx0YYYYY
 * 其中x表示必须对应相等，Y表示01均可
 * 因此，对M的每一个二进制位1，可以得到一个合法的代价形式
 * 最多有30+1个不同的代价形式
 * 枚举每种代价格式所能拿到的最大收益即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using Real = double;
using vi = vector<int>;
using pii = pair<int, int>;

int N, M;
vector<pii> A;

int lowbit(int x) {return x & -x;}

llt proc(int msk){
    llt ans = 0;
    for(const auto & p : A){
        if((msk & p.second) == p.second){
            ans += p.first;
        }
    }
    return ans;
}

llt proc(){
    llt ans = proc(M);
    for(int i=29;i>=0;--i){
        if((1 << i) & M){
            ans = max(ans, proc((M - (1 << i)) | ((1 << i) - 1)));
        }
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N >> M;
        A.assign(N + 1, {});
        for(int i=1;i<=N;++i) cin >> A[i].first >> A[i].second;
        cout << proc() << "\n";
    }
    return 0;
}